import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Heroes here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Heroe extends Personaje
{
    private int salta;//para darle la altura del salto
    private int golpe;//para evitar golpes segidos
    private int mart;//intervalo de lazamiento de cada martillo
    private int dir;//dirrecion en la que esta mario
    private int cam;//indica cuando mario esta en el suelo
    private int vidas;//saver cuando mario fue vencido
    private int distmarti;//distancia del martillo
    private int puntos;//puntos
    private boolean mover;//para indicar cuando se puede mover
    /**
     * Act - do whatever the Heroes wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public Heroe(boolean mov)
    {
        golpe=0;
        salta=0;
        mart=0;
        dir=2;
        cam=0;
        vidas=15;
        distmarti=40;
        puntos=0; 
        mover=mov;
    }

    /**
     * me da el valor de mover para saber si se va a mover el presonaje
     */
    public boolean getmover()
    {
        return mover;
    }

    /**
     * indicar cuando ya se puede mover
     */
    public void moverper()
    {
        mover=true;
    }

    /**
     *en este metodo es la cual hace que el jugador se mueva
     */
    public void mover(GreenfootImage[] imagen)
    {
        //vidas= ((getWorld()).getCounter()).valor();
        Actor izq=super.getOneObjectAtOffset(-9,0,Pared.class);
        Actor der=super.getOneObjectAtOffset(9,0,Pared.class);
        if(Greenfoot.isKeyDown("left")&&izq==null)
        {

            move(-3);

            setImage(imagen[5]);

            dir=-2;
        }
        if(Greenfoot.isKeyDown("right")&&der==null)
        {

            move(3);

            dir=2;
            setImage(imagen[4]);

        }
        if(Greenfoot.isKeyDown("up")&& salta==0 && !haysuelo(imagen))
        {   
            Greenfoot.playSound("Jump.wav");  
            salta=salta+1;

        }

        if(golpe==0)
        {
            tocaenemigo();
            //tocafuego();
            //tocarayo();
            tocatrampa();
            //tocaboss();
        }
        else
        {
            golpe++;
            if(golpe==40)
                golpe=0;
        }
        // toca();
        saltar(imagen);
        if(salta==10)
            salta=0;
        cam++;
        haysuelo(imagen);
    } 

    /****
     * checa si tococ un Octorok para resta vida 
     */ 
    public void tocaenemigo()
    {
        Actor a=getOneIntersectingObject(Enemigos.class);
        if(a!=null)
        {
            restavida();     
            setLocation(getX()-20,getY());
            golpe++;
        }
    }

    

    /****
     * checa si tococ un pico para resta vida 
     */
    public void tocatrampa()
    {
        Actor a=getOneIntersectingObject(trampa.class);
        if(a!=null)
        {
            restavida();
            setLocation(getX(),getY()+10);  
            golpe++;
        }
    }

    /**
     *En este metodo de graveda es la encargada de que gale a los personajes
     */
    public void gravedad()
    {     
        setLocation(getX(),getY()+2);        
    } 

    /**
     * verifica si hay suelo
     */
    public boolean haysuelo(GreenfootImage[] imagen)
    {
        Actor a=super.getOneObjectAtOffset(0,17,Plataforma.class);
        Actor p=super.getOneObjectAtOffset(0,20,Pared.class);
        if(a==null&&p==null)
            gravedad();
        else
        {
            if(cam>5)
            {
                if(dir==2)
                    setImage(imagen[0]);
                else
                    setImage(imagen[1]);

                cam=0;

            }
            return(false);
        }
        return true;//setLocation(getX(),getY()-4); 
    } 

    /**
     * realiza el salto de jugador
     */
    public void saltar(GreenfootImage[] imagen)
    {

        if(salta!=0)
        {
            setLocation(getX(),getY()-10);
            if(dir==2)
                setImage(imagen[6]);

            else
                setImage(imagen[7]);

            salta=salta+1;   
        }

    }


    /****
     * en este metodo se resta vida a mario
     */
    public void restavida()
    {

        Mundo  g=(Mundo)getWorld();
        Contador c=g.getCounter();
        c.decrementa();
        vidas=c.valor();

    }

    /****
     * en este metodo se le suma vida a mario 
     */
    public void sumavida()
    {
        Mundo  g=(Mundo)getWorld();
        Contador vida=g.getCounter();
        vida.incrementa();
        vidas++;
    }

    /******
     * suma puntos se le manda el valor a sumar 
     */
    public void sumapun(int v)
    {
        Mundo  g=(Mundo)getWorld();
        Contador pun=g.getpuntos();
        pun.suma(v);
    }

    /*****
     * incrementa el alcance del martillo
     */
    public void incremart()
    {
        Mundo  g=(Mundo)getWorld();
        Contador  di=g.distancia();
        distmarti=di.sumdist(5);
    }

    /****
     * se llama cuando mario pierde todas sus vidas
     */
    public void pierdes()
    {
        World mundo;
        mundo=super.getWorld();
        Mundo  g=(Mundo)getWorld();
        mundo.removeObjects(mundo.getObjects(Actor.class) );
        mundo.setBackground("gameover.jpg");
        g.musicstop();
        Greenfoot.playSound("Jump.wav");  
        Atras atras = new Atras(g);
        g.addObject(atras, 502, 100);
        puntosact(g);
        mover=false;
    }

    public void puntosact(Mundo mundo)
    {
        Contador c=mundo.getpuntos();
        puntos=c.valor();

        if(UserInfo.isStorageAvailable())
        {

            UserInfo info=UserInfo.getMyInfo();

            info.setScore(puntos);

            info.store();
        }
    }   

    /**
     * regresa el valor de mart
     */
    public int getMartillo()
    {
        return mart;
    }

    /**
     * incrementa la variable mart
     */
    public void martincrem()
    {
        mart++;
        if(getMartillo()==30)
            mart=0;
    }

    /**
     * regrese el valor de dir 
     */
    public int getdir()
    {
        return dir;
    }

    /**
     * regresa el valor de la distancia del martillo
     */
    public int getdistmarti()
    {
        return distmarti;
    }

    /**
     * resetea la variable cam
     */
    public void resetcam()
    {
        cam=0;
    }

    public boolean checaclick()
    {
        if(Greenfoot.mouseClicked(this))
        {
            moverper();
            return true;
        }
        return false;
    }

    public void modividas(int vi)
    {
        vidas=vi;
    }

    public int getvidas()
    {
        return vidas;
    }

    public void  martilloreset()
    {
        mart=0;
    }
}